package dao

import (
	"time"
)

// 这是 Topic 的全局公开dao对象，被service层调用!
var TopicDao = topicDao{}

// 主题内容表
// 这是 topic表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type Topic struct {
	Tid           int32     `json:"tid" form:"tid" db:"tid" v:"tid"`
	Title         string    `json:"title" form:"title" db:"title" v:"title"`
	Content       string    `json:"content" form:"content" db:"content" v:"content"`
	Nid           int32     `json:"nid" form:"nid" db:"nid" v:"nid"`                                                 // 节点id
	Uid           int32     `json:"uid" form:"uid" db:"uid" v:"uid"`                                                 // 帖子作者
	LastReplyUid  int32     `json:"last_reply_uid" form:"last_reply_uid" db:"last_reply_uid" v:"last_reply_uid"`     // 最后回复者
	LastReplyTime time.Time `json:"last_reply_time" form:"last_reply_time" db:"last_reply_time" v:"last_reply_time"` // 最后回复时间
	Flag          int8      `json:"flag" form:"flag" db:"flag" v:"flag"`                                             // 审核标识,0-未审核,1-已审核,2-审核删除;3-用户自己删除
	EditorUid     int32     `json:"editor_uid" form:"editor_uid" db:"editor_uid" v:"editor_uid"`                     // 最后编辑人
	Top           int8      `json:"top" form:"top" db:"top" v:"top"`                                                 // 置顶，0否，1置顶
	TopTime       int32     `json:"top_time" form:"top_time" db:"top_time" v:"top_time"`                             // 置顶时间
	Tags          string    `json:"tags" form:"tags" db:"tags" v:"tags"`                                             // tag,逗号分隔
	Permission    int8      `json:"permission" form:"permission" db:"permission" v:"permission"`                     // 访问权限：0-公开；1-登录用户可见；2-关注的人可见；3-付费用户可见
	CloseReply    int8      `json:"close_reply" form:"close_reply" db:"close_reply" v:"close_reply"`                 // 是否关闭回复评论功能，1-是；0-否
	Ctime         time.Time `json:"ctime" form:"ctime" db:"ctime" v:"ctime"`
	Mtime         time.Time `json:"mtime" form:"mtime" db:"mtime" v:"mtime"`
}

// 注意:这是 Topic 的私有dao对象，只能在dao层内使用!
type topicDao struct {
	InsertTemplate func(arg Topic) (int64, error)       //插入一条记录
	UpdateTemplate func(arg Topic) (int64, error)       //更新一条记录
	DeleteTemplate func(id int64) (int64, error)        `arg:"id"` //根据传入的主键删除一条记录
	SelectTemplate func(id int64) (Topic, error)        `arg:"id"` //根据传入的主键获取一条记录
	List           func(arg TopicList) ([]Topic, error) //模糊分页查询

	LoadNodes      func() ([]NodeInfo, error)
	FindTopicNodes func() ([]TopicNode, error)

	FindOne      func(nid int) (TopicNode, error)      `arg:"nid"` // 返回一条TopicNode记录
	FindByEname  func(ename string) (TopicNode, error) `arg:"ename"`
	FindByNids   func(nids []int) ([]TopicNode, error) `arg:"nids"`
	FindByParent func(pid, num int) ([]TopicNode, error)`arg:"pid,num"`
}


type NodeInfo struct {
	Id           int       `json:"id" form:"id" db:"id" v:"id"`
	Name         string    `json:"name" form:"name" db:"name" v:"name"`         // 虚拟节点名
	Parent       int       `json:"parent" form:"parent" db:"parent" v:"parent"` // 父节点id,无父节点时为0
	Nid          int       `json:"nid" form:"nid" db:"nid" v:"nid"`             // topic_node nid,虚拟节点为0
	Sort         int16     `json:"sort" form:"sort" db:"sort" v:"sort"`         // 节点排序,小的在前面
	CreatedAt    time.Time `json:"created_at" form:"created_at" db:"created_at" v:"created_at"`
	TNid         int       `json:"t_nid" form:"nid" db:"nid" v:"nid"`
	TParent      int       `json:"t_parent" form:"parent" db:"parent" v:"parent"`                       // 父节点id,无父节点为0
	TName        string    `json:"t_name" form:"name" db:"name" v:"name"`                               // 节点名
	TSort        int       `json:"t_sort" form:"sort" db:"sort" v:"sort"`                               // 节点排序,小的在前
	Logo         string    `json:"logo" form:"logo" db:"logo" v:"logo"`                                 // 节点logo
	Ename        string    `json:"ename" form:"ename" db:"ename" v:"ename"`                             // 节点英文名,用于导航
	Introduction string    `json:"introduction" form:"introduction" db:"introduction" v:"introduction"` // 节点简介
	ShowIndex    bool      `json:"show_index" form:"show_index" db:"show_index" v:"show_index"`         // 主题是否在首页显示
	Ctime        time.Time `json:"ctime" form:"ctime" db:"ctime" v:"ctime"`
}

// 帖子节点表
// 这是 topic_node表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type TopicNode struct {
	Nid          int       `json:"nid" form:"nid" db:"nid" v:"nid"`
	Parent       int       `json:"parent" form:"parent" db:"parent" v:"parent"`                         // 父节点id,无父节点为0
	Logo         string    `json:"logo" form:"logo" db:"logo" v:"logo"`                                 // 节点logo
	Name         string    `json:"name" form:"name" db:"name" v:"name"`                                 // 节点名
	Ename        string    `json:"ename" form:"ename" db:"ename" v:"ename"`                             // 节点英文名,用于导航
	Introduction string    `json:"introduction" form:"introduction" db:"introduction" v:"introduction"` // 节点简介
	Sort         int       `json:"sort" form:"sort" db:"sort" v:"sort"`                                 // 节点排序,小的在前
	ShowIndex    bool      `json:"show_index" form:"show_index" db:"show_index" v:"show_index"`         // 主题是否在首页显示
	Ctime        time.Time `json:"ctime" form:"ctime" db:"ctime" v:"ctime"`
}

// 这是 topic 表的批量请求参数
type TopicReq struct {
	List []Topic `json:"list" form:"list"`
}

// 这是 topicDao.List()方法的请求参数
type TopicList struct {
	Page
}
